iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Software Development

Rails Active Model系列 第 6

D-6 傳入的 attribute 不會被 assign 為 instance variable !

  • 分享至 

  • xImage
  •  

前面我們介紹過了 attribute 的用處,接著我們來探討一下與平常習慣的 attr_accessor 有什麼不同。

他跟 attr_accessor 不一樣的地方是,儲存變數的方式用的不是實體變數,所以如果想在 code 裡面使用 @(attr) 去讀變數是讀不到的!

他儲存的地方在 @attributes 裡面,他是一個 ActiveModel::AttributeSet

他並不是單純的 hash,裡面也不是單純的 key and value,而是包含了眾多像是資料轉型前後的資訊、attr 名稱以及使用的轉換器等等。

所以要讀取或寫入這些使用 attribute 所定義的值,你必須使用他提供的 (attr) & (attr)= method。
For example:

class MyClass
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :title
  
  def perform
    p "實體變數: 『#{@title}』"
    p "方法: 『#{title}』"
  end
end

然後我們建一個物件,再 perform 他看看裡面的值長什麼樣子

obj = MyClass.new title: '標題唷'
obj.perform

印出如下:

"實體變數: 『』"
"方法: 『標題唷』"

可以看到實體變數的部分是沒有值的。

在享用 attribute 給你帶來的便利魔法的同時,還是要習慣一下他的特點啦。XD

我們來看一下裡面的結構,在 console 裡看起來很大一包很難看:

pp obj
#<MyClass:0x00007fc023b94b10
 @attributes=
  #<ActiveModel::AttributeSet:0x00007fc023b94a98
   @attributes=
    {"title"=>
      #<ActiveModel::Attribute::FromUser:0x00007fc023b94728
       @name="title",
       @original_attribute=
        #<ActiveModel::Attribute::WithCastValue:0x00007fc023b949d0
         @name="title",
         @original_attribute=nil,
         @type=
          #<ActiveModel::Type::Value:0x00007fc023b8f2a0
           @limit=nil,
           @precision=nil,
           @scale=nil>,
         @value_before_type_cast=nil>,
       @type=
        #<ActiveModel::Type::Value:0x00007fc023b8f2a0
         @limit=nil,
         @precision=nil,
         @scale=nil>,
       @value="標題唷",
       @value_before_type_cast="標題唷">}>>

關於如何讓他在 console 裡看起來能好看一點,之後會講XD。


上一篇
D-5 Active Model 擴充功能 - Attributes - 2
下一篇
D-7 attribute 預設值不能直接使用容器型別
系列文
Rails Active Model28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言